| 簡短描述 | |
|---|---|
|
檔案:
\examples\Processing\Geometry\ScalingLine\ScalingLineP16.va |
|
|
預設平台: mE5-MA-VCL |
|
|
簡短說明 Scaling 以及線掃描影像的處理與轉換 |
|
VisualApplets 設計的「ScalingLineP8.va」與「ScalingLineP16.va」,可將 CameraLink Full 配置下灰階線掃描相機所拍攝的影像, 透過任意倍率進行縮放,以轉換輸入與輸出影像之間的寬度。「ScalingLineP8.va」是針對 8 級並行度所設計,而 「ScalingLineP16.va」則針對 16 級並行度,適用於marathon VCL 平台。 本文檔描述了VisualApplets 中的演算法與實作。若要使用此設計,需計算若干查表 值。 隨附的 C++ 與 Matlab 程式可進行這些計算,以簡化使用流程。
線性影像的縮放/變換/失真校正,是基於來源影像與目標影像的座標進行的。 以下將透過範例座標對,並採用 4 級並行處理,說明該 演算法的基礎原理。
目標座標: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13
14 15
來源座標: 0.3 0.5 1.4 1.5 | 2.2 3.4 3.6 4.2| 5.4 5.5 7.8 8.5 | 9.1 11.4 13.3 14.1
我們採用「目標至來源」的處理程序。對於目標影像(即輸出至電腦的影像)中的每個像素,我們會選取對應的 (四捨五入後的)整數座標 以及來源影像中對應的像素值。 為了處理像素之間的間距,我們還會選取 來源影像中當前像素 座標的前一個鄰近像素。透過線性插值,即可計算出輸出影像中的正確像素值。 由於並行處理的限制,無法從來源影像中逐個讀取像素。因此必須以合適的順序讀取「字」(即同時讀取的 像素單位)。 可能發生某個「字」需要讀取多次,或根本不需要讀取的情況。在這些從原始 影像讀取的「字」中,必須選取正確的像素位置以 生成輸出「字」。讀取的「字」中不需要的像素將會被刪除。以下範例 說明從原始影像 座標進行讀取存取的過程:
| 記憶體讀取次數(週期) | 要求的目標座標 | 各來源座標 | 讀取 Word/包含 Pixel | 在 Word 中使用 Pixel |
|---|---|---|---|---|
| 1 | 0, 1 2, 3 | 0.3, 0.5, 1.4, 1.5 | 0/ 0、1、2、3 | 1, 1, 2, 2 |
| 2 | 4 | 2.2 | 0/ 0、1、2、3 | 3、x、x、x |
| 3 | 5, 6, 7, 8 | 3.4, 3.6, 4.2, 5.4 | 1/ 4、5、6、7 | 4, 4, 5, 6 |
| 4 | 9 | 5.5 | 1/ 4、5、6、7 | 6、x、x、x |
| 5 | 10, 11, 12 | 7.8, 8.5, 9.1 | 2/ 8、9、10、11 | 9, 8, 10, x |
| 6 | 13, 14, 15 | 11.4, 13.3, 14.1 | 3 / 12、13、14、15 | 12, 14, 15, x |
表 24. 閱讀週期
而「x」則表示該像素已被刪除。
該設計的主要組成部分如下(圖335):
1. 與線掃描相機的介面,包含觸發系統與緩衝區;
2. 相機影像的Scaling (單位為 轉換中);
3. 透過 DMA 將資料傳輸至個人電腦;
以下我們將說明主要組件 轉換 進行詳細說明。
您可以查看 變換 的組成部分,請參見圖336。
相機線掃描影像的縮放是透過「目標至來源」程序進行的。 在 WordToRead 中,我們選定以何種有效 順序從輸入 相機影像中讀取 8 個 (「ScalingLineP8.va」中並行度為 8)或 16 個(「ScalingLineP16.va」中並行度為 16)像素(=「字」)的群組。在 PixelPicker 中,我們決定從讀取的「字」中需要哪些像素。 插值 在計算 輸出影像中的像素值時,會考慮來源影像中像素間的位置關係。
WordToRead 模組的組成部分如圖337 所示。
從原始影像中讀取單字的順序與頻率,定義於 LUT: WordsToRead中定義。此 表格的內容可透過外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組「LUTS_Scaling.m」 及「ScalingTablelLine.m」建立。 相關詳情請參閱本文件中的 節。此查找表的輸入連結由 CreateBlankImage 以及 Coordinate_X。參數 ImageWidth 的 CreateBlankImage 的參數ImageWidth的值,必須與 LUT:WordsToRead中的元素數完全相同。參數 ImageHeight 必須與來源影像在 y 方向上的尺寸相符。來源影像中的文字會從 緩衝區 LineMemoryRandomRd_1 和 LineMemoryRandomRd_2 中讀取,其順序由 LUT:WordsToRead所定義的順序中讀取。來源影像會以線性方式寫入這些緩衝區。由於最大位元 深度為 64 位元且平行度為 1,因此需要兩個緩衝區。對於每個字,系統會選取並讀取前一字的最後一個像素(位於 SYNC)選取並讀取前一字的最後一個像素(位於SYNC 之前的上層運算行)。此值會透過運算子 Merge運算子,將其加到對應的字中。
在模組中 PixelPicker (參見圖338)中,用於縮放後 輸出字元的像素是透過元件 Pick_0 至 Pick_15 (或至 Pick_7 並行度為 8)從讀取的單詞中選取。若讀取的單詞中的像素無需使用(參見 節) 則查表 RemovePixel 會將其刪除。上述表格(Pick_0 至 Pick_15 及 RemovePixel)的內容,可透過外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組 「LUTS_Scaling.m」與「ScalingTablelLine.m」。有關此部分,請參閱本文件中 一節。
在圖339中,HierarchicalBox 的內容 Pick_0 的內容。該 查表 PickComponent0 定義了從(SelectFromParallel: Word 與 Coordinate_X: 數字)中的哪個像素是當前輸出單字的第 0 個組件。透過運算子 CASE 運算子 將選取對應的像素。該像素將與其前一個像素合併後,寫入當前像素(MergePixel)。類似於上述 所述程序,透過 模組 Pick_1 至 Pick_15 (或至 Pick_7)。單一像素 Pick_0 至 Pick_15 (或至 Pick_7) 會以 16 或 8 的並行度與當前經轉換/縮放的單詞進行合併 (MergeParallel ,如圖338 所示)。
為了在傳送至電腦的輸出影像中,獲得像素位置的正確數值,必須考量 原始影像中的像素間位置。 在此模組中 「插值」 模組(圖336)中,會執行線性插值 [Bur06]:
這裡
是輸出影像中的像素值,
該值對應於
在原始圖像中
位於 x 位置。此外
進行明確的生命週期管理即呼叫
是位於像素座標處的數值
進行明確的生命週期管理即呼叫
在原始圖像中。像素間的位置是
. 有關線性插值的更多資訊,
您可參閱例如 [Bur06]。
本模組的內容 Interpolation 顯示於圖 340.
當前像素的數值
以及他們的
前任者
以運算子分隔
SelectBitField:當前 進行明確的生命週期管理即呼叫 SelectBitField:上一頁. 這些數值的
進行明確的生命週期管理即呼叫
與……相乘
進行明確的生命週期管理即呼叫
根據方程式
30. 關於像素間位置的資訊
包含於四個查表中
Fractional_Part0 設為 分數_第3部分 在設計「ScalingLineP16.va」中。每個 表格都包含 4 個像素的
當前輸出字的像素間位置
.
每個像素間的位置皆具有 6 位元色深。LUT 的內容 Fractional_Part0 設為 分數_第3部分 可透過
外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組「LUTS_Scaling.m」及
「ScalingTablelLine.m」建立。關於此點,請參閱
第 在本文件中。
設計「ScalingLineP8.va」包含一個名為 Fractional 的表格,其中儲存了像素間的
位置。其內容亦可透過外部的 C++ 及 Matlab 程式模組建立。
最後,經變換/縮放後的線條影像會透過 DMA 傳輸傳送至個人電腦(參見圖 336)。
設計「ScalingLineP16.va」和「ScalingLineP8.va」所需的查表(參見章節 )可透過 C++ 程式 「ScalingLUTs.cpp」(位於「LUTS_Cpp」資料夾中),亦可透過 MATLAB 程式模組「LUTS_Scaling.m」和「ScalingTableLine.m」(位於 「LUTS_MATLAB」資料夾中)來建立。
1. 請在程式中(或於命令提示字元中)定義以下參數:
//////////////////////Parameter////////////////////
/ 請指定這些參數!//////////
uint64_t parallelism = 8; // 「ScalingLineP8.va」的值為 8,「ScalingLineP16.va」的值為 16
uint64_t fractionalBits = 6; // = 6:在「ScalingLineP8.va」和「ScalingLineP16.va」中的預設值
uint64_t noOfFractionalLUTs = parallelism == 8 ? 1 : 4; // 分數查找表的數量在 "ScalingLineP8.va" 中為 1,而在
"ScalingLineP16.va" 中為 4
int InputWidth; // 輸入影像的寬度
int OutputWidth; // 傳送至電腦的影像寬度
對於VisualApplets 設計中的「ScalingLineP16.va」,請將並行度參數設定為 16;而「ScalingLineP8.va」則設定為 8。 6 的「fractionalBits」數值是 這兩個設計中的預設值。設計「ScalingLineP16.va」包含四個表(const int noOfFractionalLUTs = 4),其中載有 用於 插值的像素間位置(參見圖340)。 設計「ScalingLineP8.va」則僅有一個表格 (const int noOfFractionalLUTs = 1)。 線條影像的縮放比例由 InputWidth 與 OutputWidth 之間的關係所決定。
2. Run the program!
3. 系統會建立以下檔案,這些檔案可載入至VisualApplets 設計中的查閱表中:
| 檔案 | VA LUT |
|---|---|
| FractionalTable_0.txt 至 FractionalTable_3.txt | Fractional_Part0 (或「分數」以表示並行度為 8) 至 FractionalPart_3 |
| PickerTable_0.txt 至 PickerTable_15.txt (或改為 PickerTable_7.txt) | PickComponent0 至 PickComponent15 (或至 PickComponent7) |
| TableWordsToRead.txt | WordsToRead |
| RemoveTable.txt | RemovePixel |
表 25. Visual Applets 中的檔案及其對應的查閱表
此外,文字檔案 ScalingTable.txt 也會被建立。該檔案針對每個輸出影像像素,皆包含其在 原始影像中的對應座標(另請參閱 節)。
請開啟模組「ScalingTableLine.m」,並定義相關參數
InputWidth=…;
OutputWidth=…;
1. 執行程式!
2. 建立文字檔 ScalingTableLine.txt。該檔針對每個輸出影像的像素,皆包含其在原始影像中的對應座標 。
3. 請開啟模組「LUTS_Scaling.m」,並定義相關參數
並行性 = ...;
NoOfFractionalBits=...;
NoOfFractionalTables=...;
執行程式!所建立的檔案對應於表25中的檔案,這些檔案可載入至VisualApplets 設計中的查閱表中。


上一頁

